package com.neusoft.chenanqi.service;

import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.neusoft.chenanqi.dao.EmpSalDao;
import com.neusoft.chenanqi.dto.EmpSalDto;
import com.zero.basic.exception.SmsErrorConstant;
import com.zero.basic.exception.SmsRuntimeException;
import com.zero.basic.exception.SmsStatusCode;
import com.zero.basic.model.Pager;
import com.zero.mms.model.EmpSalary;
import com.zero.mms.model.SalaryItem;

@Service("importItemService")
@Transactional(rollbackFor = Exception.class)
public class ImportItemServiceImpl implements ImportItemService {
	
	@Inject
	private EmpSalDao empSalDao;

	// 根据条件查询导入项目列表
	@Override
	public Pager<EmpSalDto> listImportItem(String depName, String empNo,
			String startMonth, String endMonth) throws SmsRuntimeException {
		try {
			if (depName == null) {
				depName = "*";
			}
			if (empNo == null) {
				empNo = "*";
			}
			if (startMonth == null) {
				startMonth = "*";
			}
			if (endMonth == null) {
				endMonth = "*";
			}
			
			// 获得导入项目记录的人员月份信息
			Pager<EmpSalDto> empSalDtoPager = empSalDao.listEmpSal(depName, empNo, startMonth, endMonth, null, null, "导入");
			
			// 获取导入项目名称列表
			List<SalaryItem> salaryItemList = empSalDao.listSalItemByType("导入");
			List<String> importItemNameList = new ArrayList<String>();
			for (SalaryItem salaryItem : salaryItemList) {
				importItemNameList.add(salaryItem.getSalaryItemName());
			}
			
			// 获得每条导入项目记录的所有导入项目值
			List<EmpSalDto> empSalDtoList = empSalDtoPager.getDatas();
			for (EmpSalDto empSalDto : empSalDtoList) {
				empSalDto.setSalItemName(importItemNameList);
				for (String importItemName : importItemNameList) {
					EmpSalary empSalary = empSalDao.getEmpSalByEmpNoMonthAndItemName(empSalDto.getEmpNo().toString(), 
							empSalDto.getMonth(), importItemName);
					
					if (empSalary == null || empSalary.getEmpSalaryNum() == null || "".equals(empSalary.getEmpSalaryNum())) {
						empSalDto.addsalItemValue("0");
					} else {
						empSalDto.addsalItemValue(empSalary.getEmpSalaryNum());
					}
				}
			}
			
			return empSalDtoPager;
		} catch (Exception e) {
			e.printStackTrace();
			throw new SmsRuntimeException(SmsStatusCode.SERVER_ERROR,
					SmsErrorConstant.WEB_APPLICATION, "查询导入项目列表失败");
		}
	}

	// 更新导入项目信息
	@Override
	public void updateImportItem(String empNo, String month,
			String[] importItemName, String[] importItemValue)
			throws SmsRuntimeException {
		try {
			for (int i = 0; i < importItemName.length; i++) {
				if (!"*".equals(importItemValue[i]) && !"".equals(importItemValue[i])) {
					SalaryItem salaryItem = empSalDao.getSalItemByNameAndType(importItemName[i], "导入");
					if (salaryItem == null) {
						throw new SmsRuntimeException(SmsStatusCode.INVALID_CODE,
								SmsErrorConstant.INVALID_AUGUMENT, "存在未知的导入项目");
					}
					EmpSalary empSalary = empSalDao.getEmpSalByEmpNoMonthAndItemName(empNo, month, importItemName[i]);
					if (empSalary == null) {
						empSalary = new EmpSalary();
						Integer empId = Integer.parseInt(empNo);
						empSalary.setEmpId(empId);
						empSalary.setEmpSalaryDate(month);
						empSalary.setSalaryItemId(salaryItem.getSalaryItemId().toString());
						empSalary.setEmpSalaryNum(importItemValue[i]);
						empSalDao.add(empSalary);
					} else {
						if (empSalary.getEmpSalaryState() != null && 
								"已发".equals(empSalary.getEmpSalaryState())) {
							throw new SmsRuntimeException(SmsStatusCode.INVALID_CODE,
									SmsErrorConstant.INVALID_AUGUMENT, "不能更改已发放的工资项目");
						}
						empSalary.setEmpSalaryNum(importItemValue[i]);
						empSalDao.update(empSalary);
					}
				}
			}
		} catch (SmsRuntimeException e) {
			e.printStackTrace();
			throw e;
		} catch (Exception e) {
			e.printStackTrace();
			throw new SmsRuntimeException(SmsStatusCode.SERVER_ERROR,
					SmsErrorConstant.WEB_APPLICATION, "更新导入项目信息失败");
		}
	}

	// 批量录入导入项目信息
	@Override
	public void importImportItem(String month, List<EmpSalDto> empSalDtoList)
			throws SmsRuntimeException {
		try {
			for (EmpSalDto empSalDto : empSalDtoList) {
				updateImportItem(empSalDto.getEmpNo().toString(), month, 
						empSalDto.getSalItemName().toArray(new String[0]), 
						empSalDto.getSalItemValue().toArray(new String[0]));
			}
		} catch (SmsRuntimeException e) {
			e.printStackTrace();
			throw e;
		} catch (Exception e) {
			e.printStackTrace();
			throw new SmsRuntimeException(SmsStatusCode.SERVER_ERROR,
					SmsErrorConstant.WEB_APPLICATION, "批量录入导入项目信息失败");
		}
	}

}
